package com.cskaoyan.javase.oop1._11static._5exercise;

/**
 * 读程序题
 * 首先找main方法,它是程序的入口方法
 * 但是不要忘记启动main方法会触发类加载
 *
 * 在类加载的过程中,需要执行的代码,目前主要有:
 *      静态成员变量的默认初始化和显式赋值
 *      显式赋值都是按照代码的书写顺序从上往下执行的
 *
 * 在debug模式下,某个类类加载过程中的代码执行,体现为"<clinit>"方法栈帧进栈,这个方法是JVM自动把类加载过程中需要执行的代码封装成的方法
 * 类加载是可以连环触发的,体现在方法栈帧上就是"<clinit>"方法的进栈
 *
 * @since 16:20
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    // 静态成员变量的显式赋值
    static Dog d = new Dog();

    // 静态成员变量的显式赋值
    static Cat cat = new Cat();
    // 成员变量的显式赋值
    Dog dog = new Dog();
    Dog dog2;
    static Dog dog3;

    // 启动main方法会触发类加载,所以在main方法执行之前,需要先完成Demo类的类加载
    public static void main(String[] args) {
        System.out.println("hello world!");
        // 在代码执行到main方法时,整个程序中的三个类都已经完成类加载了,不需要再次类加载了!
        Demo d = new Demo();
    }

    public Demo() {
        System.out.println("demo");
    }

}

class Cat {
    static Dog dog = new Dog();

    public Cat() {
        System.out.println("cat");
    }
}

class Dog {
    static int a = 10;

    public Dog() {
        System.out.println("dog");
    }
}